/*
 * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version.
 */

#include "PartyMemberToResurrect.h"
#include "Playerbots.h"

class IsTargetOfResurrectSpell : public SpellEntryPredicate
{
    public:
        bool Check(SpellInfo const* spellInfo) override
        {
            for (uint8 i = 0; i < 3; ++i)
            {
                if (spellInfo->Effects[i].Effect == SPELL_EFFECT_RESURRECT || spellInfo->Effects[i].Effect == SPELL_EFFECT_RESURRECT_NEW ||
                    spellInfo->Effects[i].Effect == SPELL_EFFECT_SELF_RESURRECT)
                    return true;
            }

            return false;
        }
};

class FindDeadPlayer : public FindPlayerPredicate
{
    public:
        FindDeadPlayer(PartyMemberValue* value) : value(value) { }

        bool Check(Unit* unit) override
        {
            Player* player = unit->ToPlayer();
            return player && !player->isResurrectRequested() && player->getDeathState() == DeathState::Corpse && !value->IsTargetOfSpellCast(player, predicate);
        }

    private:
        PartyMemberValue* value;
        IsTargetOfResurrectSpell predicate;
};

Unit* PartyMemberToResurrect::Calculate()
{
	FindDeadPlayer finder(this);
    return FindPartyMember(finder);
}
